#include <stdio.h>
#include <unistd.h>

int var = 100;

int main(void)
{
    printf("-----1-----\n");
    pid_t pid = fork();

    printf("----2----\n");
	
    if (pid > 0) {
		var = 700;
	    printf("I'm parent getpid = %u, BEFORE var = %d\n", getpid(), var);
	    sleep(7);
		printf("I'm parent getpid = %u, MiDDLE var = %d\n", getpid(), var);
        var = 771;
	    printf("I'm parent getpid = %u, AFTER var = %d\n", getpid(), var);
    } else {
		var = 500;
        printf("I'm child getpid = %u, BEFORE var = %d\n", getpid(),var); 
		sleep(5);
        var = 551;
	    printf("I'm child getpid = %u, AFTER var = %d\n", getpid(), var);	
	}

    printf("----3----\n");

    return 0;
}
/*
-----1-----
----2----
I'm parent getpid = 2509, BEFORE var = 700
----2----
I'm child getpid = 2510, BEFORE var = 500
I'm child getpid = 2510, AFTER var = 551
----3----
I'm parent getpid = 2509, MiDDLE var = 700
I'm parent getpid = 2509, AFTER var = 771
----3----
*/

/*
父子相同处: 全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式...
父子不同处: 1.进程ID   2.fork返回值   3.父进程ID    4.进程运行时间    5.闹钟(定时器)   6.未决信号集
似乎，子进程复制了父进程0-3G用户空间内容，以及父进程的PCB，但pid不同。真的每fork一个子进程都要将父进程的0-3G地址空间完全拷贝一份，然后在映射至物理内存吗？
当然不是!父子进程间遵循读时共享写时复制的原则。这样设计，无论子进程执行父进程的逻辑还是执行自己的逻辑都能节省内存开销。   
【重点】：父子进程共享：1. 文件描述符(打开文件的结构体)  2. mmap建立的映射区 
*/